{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Classical and Quantum Registers in Qiskit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qiskit import ClassicalRegister\n",
    "# Create a Classical Register with 2 bits.\n",
    "c = ClassicalRegister(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qiskit import QuantumRegister\n",
    "# Create a Quantum Register with 2 qubits.\n",
    "q = QuantumRegister(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Quantum Circuits in Qiskit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qiskit import QuantumCircuit\n",
    "# Create a Quantum Circuit\n",
    "qc = QuantumCircuit(q, c)\n",
    "# perform a measurement of our qubits into our bits\n",
    "qc.measure(q, c); # ; hides the output"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualization\n",
    "There are two options:\n",
    " * [matplotlib](https://matplotlib.org/) which is a python module (`pip install matplotlib`)\n",
    " * LaTeX visualization, which requires some more configuration, check the [official instructions](https://github.com/Qiskit/qiskit-tutorial/blob/master/INSTALL.md#5-visualizing-circuits-with-latex) for configuration. This was an old feature and is therefore less important to us."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Jupyter command to activate matplotlib and allow the preview of our circuit\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1b611e296d8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from qiskit.tools.visualization import matplotlib_circuit_drawer as draw\n",
    "draw(qc) # visualize quantum circuit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGB size=326x284 at 0x1B6143F8A58>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Try both and use the one you like best\n",
    "from qiskit.tools.visualization import circuit_drawer as draw2\n",
    "draw2(qc) # visualize quantum circuit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# if you want to save it to a file\n",
    "from qiskit.tools.visualization import circuit_drawer\n",
    "diagram = circuit_drawer(qc, filename=\"my_first_quantum_circuit.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "diagram.show() # or even open it on an external program (no need to save first)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Open Quantum Assembly Language (QASM)\n",
    "To learn more about this standard, check [the original paper](https://arxiv.org/abs/1707.03429), the [github repo](https://github.com/Qiskit/openqasm), the [language documentation](https://github.com/Qiskit/openqasm/blob/master/spec/qasm2.rst) and the [wikipedia entry](https://en.wikipedia.org/wiki/OpenQASM)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "OPENQASM 2.0;\n",
      "include \"qelib1.inc\";\n",
      "qreg q0[2];\n",
      "creg c0[2];\n",
      "measure q0[0] -> c0[0];\n",
      "measure q0[1] -> c0[1];\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# get the QASM representation of our circuit\n",
    "print(qc.qasm())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Suggested exercises\n",
    "\n",
    "* Change the number of bits in the classical register to a negative number.\n",
    "\n",
    "`That is your first QiskitError error and they are usually easy to interpret.`\n",
    "* Change the number of bits in the quantum register to a positive number not equal to 2 (5 for example) and run the blocks until you get an error, try to understand it.\n",
    "\n",
    "`This is because you cannot read 5 qubits into 2 bits without losing information!`\n",
    "* Now, update the number of bits accordingly and visualize your circuit.\n",
    "\n",
    "`Guarantee that the changes in the circuit diagram make sense`\n",
    "* You can keep on trying to tweek with some settings, for instance, you can *name* your registers, like `c = ClassicalRegister(2, name=\"class\")` and this will reflect in the diagram.\n",
    "* Checkout more [configuration options](https://github.com/Qiskit/qiskit-tutorial/blob/master/qiskit/basics/circuit_drawing.ipynb#Visualize%20Circuit) for the layout of your diagrams"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
